﻿using CPService.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using VDS.RDF;
using VDS.RDF.Query;

namespace CPService.Controllers
{
    public class PoliticGroupsController : ApiController
    {
        // GET: api/PoliticGroups
        public IEnumerable<string> Get()
        {
            //Define a remote endpoint
            //Use the DBPedia SPARQL endpoint with the default Graph set to DBPedia
            SparqlRemoteEndpoint endpoint = new SparqlRemoteEndpoint(new Uri("http://dati.camera.it/sparql"), "http://dati.camera.it");

            //Make a SELECT query against the Endpoint
            SparqlResultSet results = endpoint.QueryWithResultSet(@"SELECT DISTINCT ?nomeGruppo
WHERE {
?persona ocd:rif_mandatoCamera ?mandato; a foaf:Person.

## deputato
?d a ocd:deputato; ocd:aderisce ?aderisce;
ocd:rif_leg <http://dati.camera.it/ocd/legislatura.rdf/repubblica_17>;
ocd:rif_mandatoCamera ?mandato.

##anagrafica
?d foaf:surname ?cognome; foaf:gender ?genere;foaf:firstName ?nome.
OPTIONAL{ 
?persona <http://purl.org/vocab/bio/0.1/Birth> ?nascita.
?nascita <http://purl.org/vocab/bio/0.1/date> ?dataNascita; 
rdfs:label ?nato; ocd:rif_luogo ?luogoNascitaUri. 
?luogoNascitaUri dc:title ?luogoNascita. 
}

##aggiornamento del sistema
OPTIONAL{?d <http://lod.xdams.org/ontologies/ods/modified> ?aggiornamento.}

## mandato
?mandato ocd:rif_elezione ?elezione.  
MINUS{?mandato ocd:endDate ?fineMandato.}

## elezione
?elezione dc:coverage ?collegio.

## adesione a gruppo
?aderisce ocd:rif_gruppoParlamentare ?gruppo.
?gruppo <http://purl.org/dc/terms/alternative> ?sigla; 
dc:title ?nomeGruppo.
MINUS{?aderisce ocd:endDate ?fineAdesione}

OPTIONAL{
## adesione a Componente
?aderisce ocd:componente ?bn.
?bn ocd:rif_componente ?componente.
?componente <http://purl.org/dc/terms/alternative> ?siglaComponente; 
dc:title ?nomeComponente.
MINUS{?bn ocd:endDate ?fineAdesione}
}

## organo
?d ocd:membro ?membro.?membro ocd:rif_organo ?organo. 
?organo dc:title ?commissione .
MINUS{?membro ocd:endDate ?fineMembership}

  ##accounts
        OPTIONAL{?persona foaf:account ?accountTw. ?accountTw foaf:accountServiceHomepage ?twitter. FILTER(REGEX(STR(?twitter),'twitter.com'))}
        OPTIONAL{?persona foaf:account ?accountFb. ?accountFb foaf:accountServiceHomepage ?facebook. FILTER(REGEX(STR(?facebook),'facebook.com'))} 
        OPTIONAL{?persona foaf:account ?accountYt . ?accountYt foaf:accountServiceHomepage ?youtube. FILTER(REGEX(STR(?youtube),'youtube.com'))}
} 
");
            foreach (SparqlResult result in results)
            {
                Console.WriteLine(result.ToString());
            }

            return from result in results
                   let str = result.ToString()
                   select str.Remove(str.IndexOf('(') - 1).Substring(str.IndexOf('=') + 1);
        }

        // GET: api/PoliticGroups/5
        public PoliticGroup Get(string name)
        {
            return new PoliticGroup();
        }
    }
}
